#pragma once

namespace dzp
{
    template <class iterator,class Ref,class Ptr>
    class __reverse_iteratoe
    {
        private:
        iterator cur;
        typedef __reverse_iteratoe<iterator,Ref,Ptr> reverse_iterator;
        public:
        __reverse_iterator()
        {}
        __reverse_iterator(iterator _cur)
        :cur(_cur)
        {}
        reverse_iteratoe operator++()
        {
            --cur;
            return *this;
        }
        reverse_iteratoe operator--()
        {
            ++cur;
            return *this;
        }
        reverse_iteratoe operator++(int)
        {
            reverse_iterator tmp=*this;
            return --tmp;
        }
        reverse_iteratoe operator--(int)
        {
            reverse_iterator tmp=*this;
            return ++tmp;
        }
        bool operator==(const reverse_iterayor& it)
        {
            return cur==it.cur;
        }
        bool operator!=(const reverse_iterator& it)
        {
            return cur!=it.cur;
        }
        Ref operator*()
        {
            //正向迭代器 begin() 指向第一个元素 end() 指向最后一个元素的下一个元素的位置
            //反向迭代器与正向对称 rbegin() 指向 end() rend()指向begin()
            //所以在* 操作时需要向前移动一个位置的
            iterator tmp=cur;
            return *(--tmp);
        }
        Ptr operator->()
        {
            return &(operator*());
        }
    };
}